return {
  {
    -- 获取code-context
    'SmiteshP/nvim-navic',
    lazy = true,
    init = require('plugins.config.lsp.navic'),
  },

  {
    -- LSP 配置
    'neovim/nvim-lspconfig',
    event = { 'BufReadPost', 'BufAdd', 'BufNewFile' },
    dependencies = {
      'williamboman/mason.nvim', -- mason用于lsp安装，会自动设置环境变量，所以lspconfig需要放在mason后加载，要把lspconfig放在依赖项
      'williamboman/mason-lspconfig.nvim', -- lsp 自动安装
      'simrat39/rust-tools.nvim', -- rust 增强
      'b0o/schemastore.nvim', -- json schema
    },
    config = require('plugins.config.lsp.lspconfig'),
  },

  {
    -- lsp 增强(lspsaga)
    'glepnir/lspsaga.nvim',
    event = 'LspAttach',
    opts = require('plugins.config.lsp.lspsaga'),
    dependencies = {
      { 'nvim-tree/nvim-web-devicons' },
      { 'nvim-treesitter/nvim-treesitter' },
    },
    keys = {
      { 'gh', '<cmd>Lspsaga lsp_finder<CR>' },
      { '<leader>ca', '<cmd>Lspsaga code_action<CR>', mode = { 'n', 'v' } },
      { 'gr', '<cmd>Lspsaga rename<CR>' },
      { 'gr', '<cmd>Lspsaga rename ++project<CR>' },
      { 'gp', '<cmd>Lspsaga peek_definition<CR>' },
      { 'gd', '<cmd>Lspsaga goto_definition<CR>' },
      { 'gt', '<cmd>Lspsaga peek_type_definition<CR>' },
      { 'gt', '<cmd>Lspsaga goto_type_definition<CR>' },
      { '<leader>sl', '<cmd>Lspsaga show_line_diagnostics<CR>', desc = 'Show line diagnostic' },
      { '<leader>sb', '<cmd>Lspsaga show_buf_diagnostics<CR>', desc = 'Show buffer diagnostic' },
      { '<leader>sw', '<cmd>Lspsaga show_workspace_diagnostics<CR>', desc = 'Show workspace diagnostic' },
      { '<leader>sc', '<cmd>Lspsaga show_cursor_diagnostics<CR>', desc = 'Show cursor diagnostic' },
      { '[e', '<cmd>Lspsaga diagnostic_jump_prev<CR>', desc = 'jump prev diagnostic' },
      { ']e', '<cmd>Lspsaga diagnostic_jump_next<CR>', desc = 'jump next diagnostic' },
      {
        '[E',
        function()
          require('lspsaga.diagnostic'):goto_prev({ severity = vim.diagnostic.severity.ERROR })
        end,
        desc = 'prev diagnostic error',
      },
      {
        ']E',
        function()
          require('lspsaga.diagnostic'):goto_next({ severity = vim.diagnostic.severity.ERROR })
        end,
        desc = 'next diagnostic error',
      },
      { '<leader>o', '<cmd>Lspsaga outline<CR>', desc = 'Code Outline' },
      { 'K', '<cmd>Lspsaga hover_doc ++keep<CR>' },
      { '<Leader>ci', '<cmd>Lspsaga incoming_calls<CR>', desc = 'Incoming calls' },
      { '<Leader>co', '<cmd>Lspsaga outgoing_calls<CR>', desc = 'Outgoingcalls' },
      { '<A-d>', '<cmd>Lspsaga term_toggle<CR>', mode = { 'n', 't' } },
    },
  },

  {
    -- formatters
    'jay-babu/mason-null-ls.nvim',
    event = 'LspAttach',
    config = require('plugins.config.lsp.null-ls'),
    dependencies = {
      'williamboman/mason.nvim',
      'jose-elias-alvarez/null-ls.nvim',
    },
  },
}
